package org.transmit.form.vali;


import java.awt.print.Printable;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import javax.servlet.http.HttpServletResponse;

import org.transmit.ActionContext;
import org.transmit.form.key.Vali;
import org.transmit.form.key.Verify;


/**
 * 验证对象是各种属性
* @Title: ValidationPage.java 
* @Package org.transmit.form.vali 
* @Description: TODO 
* @author porridge
* @url  http://www.prdblog.com/
* @email  mfkwfc@gmail.com   
* @date 2014年4月15日 下午7:48:02 
* @version V1.0
 */
public class ValidationPage {
	
	public static boolean ValidationPO(Object obj){
		return ValidationPO(obj,null);
	}
	/**
	 * 传入对象检查数据
	 * @param obj
	 * @return
	 */
	public static boolean ValidationPO(Object obj,String filename){
		boolean bl=true;
		if(obj!=null){
			Field[] fies=obj.getClass().getDeclaredFields();
			for(Field f:fies){
				if(!bl)break;
				try {
					if(filename!=null)
					        filename=","+filename+",";//加逗号的主要原因是因为好判断 不用循环判断  这样判断重复的机率将不存在
					f.setAccessible(true);
					if(f.isAnnotationPresent(Vali.class)){//判断是否有验证注解 如果有则循环下面的注解判断
						Vali vali=f.getAnnotation(Vali.class);
						Verify[] pars=vali.value();
						for(Verify p:pars){
							if(filename!=null && filename.indexOf(","+f.getName()+",")!=-1)//如果传入某个名称不需要判断则可以避免掉去
								continue;
							bl=regular(p,f.get(obj));//验证检查
							if(!bl){
								print("{\"result\":false,\"name\":\""+f.getName()+"\",\"text\":\""+p.reason()+"\"}");
								break;
							}
						}
					}
				}catch (Exception e) {
					bl=false;
					e.printStackTrace();
				}
			}
			
		}else{
			bl=false;
			print("{\"result\":false,\"name\":null,\"text\":\"对象不能为空...\"}");
		}
		return bl;
	}
	/**
	 * 正则验证代码
	 * @param p
	 * @return
	 */
	protected static boolean regular(Verify p,Object obj){
		boolean bl=true;
		if(bl && "empty".equals(p.name())){//非空验证
			if(obj==null || "".equals(obj))
				bl=false;
		}
		if(bl && "number".equals(p.name())){//数字
			if(isnull(obj)){
				if(!obj.toString().matches("\\d*")){
					bl=false;
				}
			}
		}
        if(bl && "float".equals(p.name())){//浮点数
        	if(isnull(obj)){
        		if(!obj.toString().matches("\\d*.\\d*")){
					bl=false;
				}
			}
		}
        if(bl && "lenmax".equals(p.name())){//最大长度
        	if(isnull(obj)){
				if(obj.toString().length()>p.len())
					bl=false;
			}
        }
        if(bl && "lenmin".equals(p.name())){//最小长度
        	if(isnull(obj)){
				if(obj.toString().length()<p.len())
					bl=false;
			}
		}
		if(bl && "eng".equals(p.name())){//纯英文 不区分大小写
			if(isnull(obj)){
				if(!obj.toString().matches("[a-zA-Z]*")){
					bl=false;
				}
			}
		}
		if(bl && "word".equals(p.name())){//数字+字母 
			if(isnull(obj)){
				if(!obj.toString().matches("\\w*")){
					bl=false;
				}
			}
		}
		if(bl && "date".equals(p.name())){//时间 
			if(isnull(obj)){
				if(!obj.toString().matches("\\d\\d\\d\\d-\\d\\d-\\d\\d"))
					bl=false;
			}
		}
		if(bl && "iden".equals(p.name())){//身份证 
			if(isnull(obj)){
				if(!obj.toString().matches("^(\\d{15}$|^\\d{18}$|^\\d{17}(\\d|X|x))$"))
					bl=false;
			}
		}
		
		if(bl && "email".equals(p.name())){//邮箱 
			if(isnull(obj)){
				if(!obj.toString().matches("^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"))
					bl=false;
			}
		}
		if(bl && "phone".equals(p.name())){//电话  如果 len 不是-1 则按照 len来验证长度
			if(isnull(obj)){
				int len=11;
				if(p.len()!=-1)
					len=p.len();
				if(!(obj.toString().matches("\\d*")&&obj.toString().length()==len)){
					bl=false;
				}
			}
		}
		return bl;
	}
	/**
	 * 验证是否非空
	 * @param obj
	 * @return
	 */
	protected static boolean isnull(Object obj){
		if(obj!=null && obj.toString().trim().length()!=0)
			return true;
		else
			return false;
	}
	
	protected static void print(String name){
		HttpServletResponse response=ActionContext.getResponse();
		response.setCharacterEncoding("UTF-8");
		try {
			PrintWriter out=response.getWriter();
			out.print(name);
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
